var mongoose = require("mongoose");
mongoose.connect("mongodb://127.0.0.1/test", { useUnifiedTopology: true });
mongoose.connection.once("open", function() {
        console.log("链接成功");
    })
    //将mongose.Schema赋值给一个变量Schema
var Schema = mongoose.Schema;
//创建一个Schema对象
var stuSchema = new Schema({
    name: String,
    age: Number,
    gender: {
        type: String,
        default: "female"
    },
    address: String
});
//通过Schema来创建Model
//Model代表的是数据库中的集合，通过model才能对数据库进行操作
//mongoose.model(modelName,schema);(modelName是对什么进行映射)mongoose会自动把我们的集合名变成复数
var StuModel = mongoose.model("student", stuSchema);
//向数据库插入文档
//StuModel.create(doc,function(err){});
//用于创建一个或者多个文档对象添加到数据库中
//参数：
//  doc(s)      可以是一个文档对象也可以是多个文档对象的数组
//  callback    当我们的操作完成之后执行回调函数
// StuModel.create({
//         name: "wzc",
//         age: 18,
//         gender: "male",
//         address: "花果山"
//     }, function(err) {
//         if (!err) {
//             console.log("插入成功");
//         }
//     })
//向数据库查询
//Model.find(conditions,[projection],[options],[callback])
//  -查询所有符合条件的文档
//Model.findById(id,[projection],[options],[callback])
//  -查询文档的id属性查询文档，他也会值返回一个对象，不是数组可以直接后面加.来查询具体的属性
//  -通过find()查询的结果，返回的是对象，就是Document，文档对象，Document对象是Model的实例
//Model.findOne([conditions],[projection],[options],[callback])
//  -查询符合条件的第一个文档,他总会返回一个具体的对象，而不是一个数组
//  参数：
//      conditions  查询的条件
//      projection  投影(可以用来查询单独的选项)例子：{ name: 1, _id: 0 }还可以直接写字符串'name _id age'
//      options     查询选项（skip limit） 要写成一个对象例子：{skip:10 , limit:2}
//      callback    回调函数，查询结果会通过回调函数返回
//                      回调函数必须传，不传回调函数，压根不会查询
//                          docs是查询出来的东西，无论是查不查都会返回一个数组。如果想查询一个单独的属性需要加索引[]
// StuModel.find({ name: "wzc" }, { name: 1, _id: 0 }, function(err, docs) {
//     if (!err) {
//         console.log(docs);
//     }
// });
//修改数据库
//  Model.update(conditions,doc,[options],[callback])
//      修改一个或者多个文档
//          -参数：
//              conditions          查询条件
//              doc                 修改后的对象
//              options             配置参数
//              callback            回调函数
// StuModel.updateMany({ name: "wzc" }, {
//         $set: { age: 20 },
//         function(err) {
//             if (!err) {
//                 console.log("修改成功");
//             }
//         }
//     })
//  Model.updateMany()
//  Model.updateOne()
//
//删除数据库中的数据
//  Model.remove(conditions,[callback])
//  Model.deleteOne(conditions,[callback])
//  Model.deleteMany(conditions,[callback])
//      -懒得写了，已经很明显了
// StuModel.remove({ name: "wzc" }, function(err) {
//     if (!err) {
//         console.log("删除成功");
//     }
// })